/*------------------------------------------------------------------------------
 * @file    GREEDY_SNAKE.H
 * @author  嵌入式王子
 * @email   donminedm@163.com
 * @date    2024/12/22 21:42:03
 * @brief   开源的嵌入式软件包，本人不对此代码负责任
 * -----------------------------------------------------------------------------*/

#ifndef GREEDY_SNAKE
#define GREEDY_SNAKE

#include "main.h"
#include <stdint.h>
// 屏幕接口文件
#include "u8x8cb.h"
#define SNAKE_DEFALUT_LEN 10 // 蛇默认长度
// 蛇速度定义
#define SNAKE_SPEED_UNIT 5                          // 5ms
#define SNAKE_DEFALUT_SPEED (SNAKE_SPEED_UNIT * 20) // 蛇默认速度，越大，蛇越慢
#define SNAKE_MAX_SPEED (SNAKE_SPEED_UNIT * 1)

// 方向定义，此处根据按键寄存器地址定义 @main.h
typedef enum SNAKE_DIR
{
    DIR_UP = KEY_UP_Pin,
    DIR_DOWN = KEY_DOWN_Pin,
    DIR_LEFT = KEY_LEFT_Pin,
    DIR_RIGHT = KEY_RIGHT_Pin,
    DIR_UNKOWN = 0xffff,
} snake_dir;

// SSD1306屏幕像素 > 128 * 64
// 0  ------→ x(128-1)
// |
// |
// |
// ↓ y(64-1)
#define MAP_X_LEFT_EDGE 0    // 地图x轴左侧坐标
#define MAP_X_RIGHT_EDGE 127 // 地图x轴右侧坐标
#define MAP_Y_UP_EDGE 0      // 地图y轴上方坐标
#define MAP_Y_DOWN_EDGE 63   // 地图y轴下方坐标

// 坐标结构体
typedef struct MAP_POINT
{
    uint8_t x;
    uint8_t y;
} map_point;

// 贪吃蛇最大长度
#define SNAKE_MAX_LENGTH 500

// 贪吃蛇结构体
typedef struct SNAKE
{
    uint16_t length;                  // 长度
    volatile snake_dir dir;           // 方向
    uint16_t speed;                   // 速度 , 毫秒 ，默认 500移动
    map_point coor[SNAKE_MAX_LENGTH]; // 坐标
} snake;

// 食物结构体
typedef struct SNAKE_FOOD
{
    map_point point;
    uint8_t enable; // 食物被吃标记
} snake_food;

void snake_game_init(u8g2_t *oled);

void snake_game_loop();

#endif // !GREEDY_SNAKE